﻿using System;
using System.Collections.Specialized;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Jiubang.UnitTest
{
    /// <summary>
    /// TempSidHttpModule 的摘要说明
    /// </summary>
    [TestClass]
    public class TempSidHttpModule
    {
        public TempSidHttpModule()
        {
            //
            //TODO: 在此处添加构造函数逻辑
            //
        }

        private TestContext testContextInstance;

        /// <summary>
        ///获取或设置测试上下文，该上下文提供
        ///有关当前测试运行及其功能的信息。
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region 附加测试属性
        //
        // 编写测试时，还可使用以下附加属性:
        //
        // 在运行类中的第一个测试之前使用 ClassInitialize 运行代码
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // 在类中的所有测试都已运行之后使用 ClassCleanup 运行代码
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // 在运行每个测试之前，使用 TestInitialize 来运行代码
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // 在每个测试运行完之后，使用 TestCleanup 来运行代码
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        [TestMethod]
        public void TestMethod1()
        {
            //
            // TODO: 在此	添加测试逻辑
            //
            var context = new NameValueCollection();
            Assert.AreEqual("a.aspx?sid=111", RewriteUrl(context, "a.aspx", "111"));

            context.Add("a", "1");
            Assert.AreEqual("a.aspx?a=1&sid=111", RewriteUrl(context, "a.aspx", "111"));

            context.Add("b", "2");
            Assert.AreEqual("a.aspx?a=1&b=2&sid=111", RewriteUrl(context, "a.aspx", "111"));


            Assert.AreEqual("a.aspx?a=1&b=2&sid=111", RewriteUrl(context, "a.aspx?", "111"));

            //Assert.AreEqual(RewriteUrl("a.aspx?sid=123", "111"), "a.aspx?sid=111");
            //Assert.AreEqual(RewriteUrl("a.aspx?", "111"), "a.aspx?sid=111");
            //Assert.AreEqual(RewriteUrl("a.aspx?a=2&sid=123", "111"), "a.aspx?a=2&sid=111");

        }
        private string RewriteUrl(string url,string sid){
            int index = url.IndexOf("?sid");
            if (index == -1) index = url.IndexOf("&sid");
            //当前连接存在sid
            if (index != -1)
            {
                int end = url.IndexOf("&", index + 5);
                //sid是最后一个参数
                if (end == -1) return url.Substring(0, index + 5) + sid;
                return url.Substring(0, index + 5) + sid + url.Substring(end);
            }
            if (url.IndexOf("?") == -1) return url + "?sid=" + sid;

            return url + "&sid=" + sid;
        }
        private static string RewriteUrl(NameValueCollection collection,string url, string sid)
        {
            var sb = new StringBuilder(200);
            var index = url.IndexOf("?");
            sb.Append(index == -1 ? url + "?" : url.Substring(0, index + 1));
            var isChange = false;
            foreach (string s in collection)
            {
                if (!isChange && s == "sid")
                {
                    isChange = true;
                    sb.Append("sid=" + sid + "&");
                }
                else sb.Append(s + "=" + collection[s] + "&");
            }
            if (!isChange) sb.Append("sid=" + sid);
            return sb[sb.Length - 1] == '&' ? sb.Remove(sb.Length - 1, 1).ToString() : sb.ToString();

        }
    }
}
